import json
import os
from typing import Dict, List

class SparkChat:
    def __init__(self):
        # 加载角色配置
        self.role_config = self._load_role_config()
        if not self._validate_config(self.role_config):
            # 使用默认配置
            self.role_config = {
                "role_name": "Laya",
                "description": "你好！我是 Laya，专为来华留学生服务的智能助手！",
                "parameters": {
                    "max_tokens": 5000,
                    "top_k": 6,
                    "temperature": 1.0
                }
            }
        
        # 初始化对话上下文
        self.reset_conversation()
        # 标记是否需要首次问候
        self._first_interaction = True
        
        # 添加一些预设回复
        self.preset_responses = {
            "你好": "你好！很高兴为您服务。请问有什么关于留学的问题我可以帮助您解答？",
            "hello": "Hello! I'm glad to assist you. What questions do you have about studying in China?",
            "留学": "来中国留学是一个很棒的选择！您需要了解签证流程、学校选择、专业课程、或者生活方面的信息？",
            "visa": "For Chinese student visa, you'll need to apply for an X1 visa (for studies longer than 180 days) or X2 visa (for shorter periods). You'll need your admission letter, JW201/202 form, and other documents.",
            "学校": "中国有许多优秀的大学，如清华大学、北京大学、上海交通大学等。您对哪个城市或专业更感兴趣？我可以给您更具体的推荐。",
            "生活": "在中国生活很便利，交通发达，美食丰富。大城市如北京、上海、广州生活成本较高，但设施完善。您需要了解具体哪方面的生活信息呢？",
            "费用": "在中国留学的费用因城市和学校而异。一线城市的学费约2-8万人民币/年，生活费约3-5万人民币/年。二三线城市会更便宜一些。有具体想了解的城市吗？"
        }

    def _load_role_config(self) -> Dict:
        """加载角色配置文件"""
        try:
            current_dir = os.path.dirname(os.path.abspath(__file__))
            config_path = os.path.join(current_dir, 'role_config.json')
            with open(config_path, 'r', encoding='utf-8') as f:
                return json.load(f)
        except Exception as e:
            print(f"加载角色配置文件失败: {str(e)}")
            return {}

    def _validate_config(self, config: Dict) -> bool:
        """验证配置参数是否合法"""
        required_fields = ['parameters', 'role_name', 'description']
        for field in required_fields:
            if field not in config:
                print(f"配置文件缺少必要字段: {field}")
                return False
        return True

    def reset_conversation(self):
        """重置对话上下文（保留系统消息）"""
        self.conversation = [
            {"role": "system", "content": self.role_config.get('description', '')}
        ]
        self._first_interaction = True

    def _get_intro_message(self) -> str:
        """生成Laya的自我介绍"""
        return (
            "你好！我是 Laya，专为来华留学生服务的智能助手！\n"
            "Hi! I'm Laya, your smart assistant for studying in China!\n"
            "我可以帮你解答签证、课程、生活问题，还能教你中文、推荐美食和好玩儿的地方。\n"
            "I can help with visas, courses, daily life questions, teach you Chinese, "
            "and recommend food and fun places.\n"
            "随时找我聊，我会让你的留学生活更简单有趣！\n"
            "Reach out anytime—I'll make your study life easier and more fun! 😊"
        )

    def chat(self, user_input: str, reset: bool = False) -> str:
        """
        与Spark模型对话（简化版，使用预设回复）
        :param user_input: 用户输入内容
        :param reset: 是否重置对话上下文
        :return: 模型回复内容
        """
        if reset:
            self.reset_conversation()
        
        # 如果是首次交互，返回自我介绍
        if self._first_interaction:
            self._first_interaction = False
            intro = self._get_intro_message()
            self.conversation.append({"role": "assistant", "content": intro})
            return intro
        
        # 添加用户消息到对话历史
        self.conversation.append({"role": "user", "content": user_input})
        
        # 查找预设回复
        response = None
        for key, reply in self.preset_responses.items():
            if key in user_input.lower():
                response = reply
                break
        
        # 如果没有找到匹配的预设回复，使用默认回复
        if not response:
            if "?" in user_input or "？" in user_input:
                response = "这是个很好的问题！关于这方面，我建议您可以参考相关学校的官方网站或咨询留学顾问获取更详细的信息。您还有其他问题吗？"
            else:
                response = "谢谢您的信息！如果您有关于留学的具体问题，我很乐意帮您解答。您可以问我关于签证、学校选择、生活费用等方面的问题。"
        
        # 添加回复到对话历史
        self.conversation.append({"role": "assistant", "content": response})
        
        return response

# 单例模式
spark_chat_instance = SparkChat()

def get_spark_chat() -> SparkChat:
    """获取SparkChat实例（单例）"""
    return spark_chat_instance

if __name__ == '__main__':
    # 测试对话
    chat = SparkChat()
    print(f"当前角色: {chat.role_config['role_name']}\n")
    
    # 首次调用chat()会自动返回自我介绍
    print("Laya:", chat.chat(""))  # 空输入触发自我介绍
    
    while True:
        user_input = input("\n我: ")
        if user_input.lower() in ['quit', 'exit']:
            break
            
        response = chat.chat(user_input)
        print(f"\nLaya: {response}")